﻿using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Security.Cryptography;
using System.Net.Sockets;
using BasicModuleWebApiAuthorization.Filter;
using BasicModuleWebApiAuthorization.Authorization;
using Microsoft.AspNetCore.Authorization;
using BasicModuleWebApiAuthorization.DbConext;
using Microsoft.EntityFrameworkCore;
using BasicModuleWebApiAuthorization.DependEntity;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.Extensions.DependencyInjection;

namespace BasicModuleWebApiAuthorization
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //创建主机建造者对象
            WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder();
            webApplicationBuilder.Services.AddSwaggerGen();
            webApplicationBuilder.Services.AddControllers(option =>
            {
                //option.Filters.Add<AuthFilter>();
            });
            //在 ASP.NET Core 中，当你使用 AddAuthentication().AddCookie() 添加 Cookie 认证时，并没有直接指定一个具体的加密算法用于加密 Cookie 中的数据。
            //相反，ASP.NET Core 使用了 .NET Core 提供的 Data Protection API 来处理敏感数据的保护，这包括加密和签名。
            //Data Protection API 使用的是一种基于密钥的加密机制，但具体的加密算法（如 AES、RSA 等）是抽象化的，并且可能会随着.NET Core 版本的更新而更改。
            //Data Protection API 的目标是提供一个易于使用的 API，允许开发人员加密和验证数据，而无需深入了解底层加密机制。
            webApplicationBuilder.Services.AddAuthentication(optin =>
            {
                //配置jwt认证方案
                var deault = optin.DefaultAuthenticateScheme;
                var defalut = optin.DefaultChallengeScheme;
            }).AddCookie(option =>
            {
                option.Cookie.Name = "test";
                option.ExpireTimeSpan = TimeSpan.FromMinutes(5);
            }); //认证
            //注册自定义上下文类 
            //webApplicationBuilder.Services.AddDbContext<MysqlDBContext>(option =>
            //{
            //    option.UseMySql("Server=192.168.211.129;Port=3306;Database=Cusutomauthorization;Uid=root;Pwd=123456;", new MySqlServerVersion("5.7.20"));
            //}, ServiceLifetime.Singleton);
            //注册自定义上下文类 
            webApplicationBuilder.Services.AddDbContext<MysqlDBContext>(option =>
            {
                option.UseMySql("Server=192.168.211.129;Port=3306;Database=authorization;Uid=root;Pwd=123456;", new MySqlServerVersion("5.7.20"));
            }, ServiceLifetime.Singleton);
            #region 静态配置策略
            {
                //webApplicationBuilder.Services.AddAuthorization(option =>
                //{
                //    //创建策略 用户名等于 admin 才有权限
                //    //option.AddPolicy("username", x => x.RequireUserName("admin"));
                //    //创建策略
                //    option.AddPolicy("UserPermission", policy =>
                //    {
                //        //使用自定义授权
                //        policy.AddRequirements(new UserNameAuthorization(new List<string>() { "zs", "ls", "we" }));
                //    });
                //});

                ////使用授权
                ////webApplicationBuilder.Services.AddAuthorization(option => {
                ////    //添加授权
                ////    option.AddPolicy("UserPermission", xx => {
                ////        //使用自定义授权 
                ////        xx.AddRequirements(new UserPermissionAuthorizationRequirement("lala"));
                ////    });
                ////});

                //webApplicationBuilder.Services.AddSingleton<Lion>();
                //webApplicationBuilder.Services.AddTransient<Rabbit>();

                ////注册UserNameAuthorizationHandler处理器
                //webApplicationBuilder.Services.AddTransient<IAuthorizationHandler, UserAuthorizationHandler>();
            }
            #endregion

            #region 静态配置策略
            {
                IServiceProvider serviceProvider = webApplicationBuilder.Services.BuildServiceProvider();
                MysqlDBContext mysqlDBContext = serviceProvider.GetRequiredService<MysqlDBContext>();
                List<PermissionPolicy> permissionPolicies = mysqlDBContext.permissionPolicies.ToList();
                foreach (var item in permissionPolicies)
                {
                    //使用授权
                    webApplicationBuilder.Services.AddAuthorization(option =>
                    {
                        //使用自定义授权策略
                        option.AddPolicy(item.PolicyName, x =>
                        {
                            //添加自定义声明 http://localhost:5010/api/UserPermission/UserPermission
                            x.AddRequirements(new UserPermissionAuthorizationRequirement(item.PolicyName));
                        });
                    });
                }
            }
            #endregion


            //注册授权处理器中间件
            webApplicationBuilder.Services.AddSingleton<IAuthorizationHandler, UserPermissionAuthodrizationHandler>();
            //创建主机
            WebApplication webApplication = webApplicationBuilder.Build();

            #region 生命周期侧式
            //for (int i = 0; i < 3; i++)
            //{
            //    Lion lion = webApplication.Services.GetRequiredService<Lion>();
            //    lion.Run();
            //}
            #endregion

            webApplication.UseSwagger();
            webApplication.UseSwaggerUI();
            //webApplication.UseAuthentication();
            //1、使用身份认证中间件
            webApplication.UseAuthentication();
            //使用授权中间件
            webApplication.UseAuthorization();
            webApplication.Urls.Add("http://+:5010");

            webApplication.MapControllers();
            //运行主机
            webApplication.Run();
        }
    }
}
